2017-04-17 9 views
0

サードパーティのRESTful APIを使用する必要があります。これは私のコントローラクラスである:サードパーティのRESTful APIを消費してパラメータを渡す

@Controller 
public class BrokerController { 

    @RequestMapping(value = "/broker", method = RequestMethod.POST) 
    public @ResponseBody MyPojo brokers(@RequestBody BrokerRequest brokerRequest){ 

     RestTemplate restTemplate = new RestTemplate(); 
     final String uri = "http://www.nepalipaisa.com/Modules/MarketMovers/Services/MarketMoversServices.asmx/GetTopBrokers"; 

     MyPojo myPojo = restTemplate.postForObject(uri,brokerRequest,MyPojo.class); 
     return myPojo; 
    } 

} 

編集: - 私のPOJOクラス:正確な結果は以下の通り。すなわち

public class MyPojo { 
private String __type; 
private Integer RowTotal; 
private Integer StockID; 
private Object CodedCompany; 
private Object ClosingPrice; 
private Integer Amount; 
private Integer PreviousClosing; 
private Integer DifferenceRS; 
private Object Symbol; 
private Integer Price; 
private Integer Diff; 
private Integer PercentageDiff; 
private Object Volume; 
private Integer TotalTurnOverAmount; 
private String FirmName; 
private Integer BrokerID; 
private String BrokerCode; 
private Integer TotalTransactions; 
private Object Traded; 
private Object MaxPrice; 
private Object MinPrice; 
private Object OpeningPrice; 
private Object TotalShare; 
private Integer NoOfTransaction; 
private Integer Purchase; 
private Integer Sales; 
private Integer Matching; 


public String get__type() { 
    return __type; 
} 

public void set__type(String __type) { 
    this.__type = __type; 
} 

public Integer getRowTotal() { 
    return RowTotal; 
} 

public void setRowTotal(Integer rowTotal) { 
    this.RowTotal = rowTotal; 
} 

public Integer getStockID() { 
    return StockID; 
} 

public void setStockID(Integer stockID) { 
    this.StockID = stockID; 
} 

public Object getCodedCompany() { 
    return CodedCompany; 
} 

public void setCodedCompany(Object codedCompany) { 
    this.CodedCompany = codedCompany; 
} 

public Object getClosingPrice() { 
    return ClosingPrice; 
} 

public void setClosingPrice(Object closingPrice) { 
    this.ClosingPrice = closingPrice; 
} 

public Integer getAmount() { 
    return Amount; 
} 

public void setAmount(Integer amount) { 
    this.Amount = amount; 
} 

public Integer getPreviousClosing() { 
    return PreviousClosing; 
} 

public void setPreviousClosing(Integer previousClosing) { 
    this.PreviousClosing = previousClosing; 
} 

public Integer getDifferenceRS() { 
    return DifferenceRS; 
} 

public void setDifferenceRS(Integer differenceRS) { 
    this.DifferenceRS = differenceRS; 
} 

public Object getSymbol() { 
    return Symbol; 
} 

public void setSymbol(Object symbol) { 
    this.Symbol = symbol; 
} 

public Integer getPrice() { 
    return Price; 
} 

public void setPrice(Integer price) { 
    this.Price = price; 
} 

public Integer getDiff() { 
    return Diff; 
} 

public void setDiff(Integer diff) { 
    this.Diff = diff; 
} 

public Integer getPercentageDiff() { 
    return PercentageDiff; 
} 

public void setPercentageDiff(Integer percentageDiff) { 
    this.PercentageDiff = percentageDiff; 
} 

public Object getVolume() { 
    return Volume; 
} 

public void setVolume(Object volume) { 
    this.Volume = volume; 
} 

public Integer getTotalTurnOverAmount() { 
    return TotalTurnOverAmount; 
} 

public void setTotalTurnOverAmount(Integer totalTurnOverAmount) { 
    this.TotalTurnOverAmount = totalTurnOverAmount; 
} 

public String getFirmName() { 
    return FirmName; 
} 

public void setFirmName(String firmName) { 
    this.FirmName = firmName; 
} 

public Integer getBrokerID() { 
    return BrokerID; 
} 

public void setBrokerID(Integer brokerID) { 
    this.BrokerID = brokerID; 
} 

public String getBrokerCode() { 
    return BrokerCode; 
} 

public void setBrokerCode(String brokerCode) { 
    this.BrokerCode = brokerCode; 
} 

public Integer getTotalTransactions() { 
    return TotalTransactions; 
} 

public void setTotalTransactions(Integer totalTransactions) { 
    this.TotalTransactions = totalTransactions; 
} 

public Object getTraded() { 
    return Traded; 
} 

public void setTraded(Object traded) { 
    this.Traded = traded; 
} 

public Object getMaxPrice() { 
    return MaxPrice; 
} 

public void setMaxPrice(Object maxPrice) { 
    this.MaxPrice = maxPrice; 
} 

public Object getMinPrice() { 
    return MinPrice; 
} 

public void setMinPrice(Object minPrice) { 
    this.MinPrice = minPrice; 
} 

public Object getOpeningPrice() { 
    return OpeningPrice; 
} 

public void setOpeningPrice(Object openingPrice) { 
    this.OpeningPrice = openingPrice; 
} 

public Object getTotalShare() { 
    return TotalShare; 
} 

public void setTotalShare(Object totalShare) { 
    this.TotalShare = totalShare; 
} 

public Integer getNoOfTransaction() { 
    return NoOfTransaction; 
} 

public void setNoOfTransaction(Integer noOfTransaction) { 
    this.NoOfTransaction = noOfTransaction; 
} 

public Integer getPurchase() { 
    return Purchase; 
} 

public void setPurchase(Integer purchase) { 
    this.Purchase = purchase; 
} 

public Integer getSales() { 
    return Sales; 
} 

public void setSales(Integer sales) { 
    this.Sales = sales; 
} 

public Integer getMatching() { 
    return Matching; 
} 

public void setMatching(Integer matching) { 
    this.Matching = matching; 
} 
} 

JSON IIは、消費する必要があります。現在、

{ 
"d": [ 
    { 
     "__type": "SageFrame.MarketMovers.MarketInfo", 
     "RowTotal": 0, 
     "StockID": 0, 
     "CodedCompany": null, 
     "ClosingPrice": null, 
     "Amount": 0, 
     "PreviousClosing": 0, 
     "DifferenceRS": 0, 
     "Symbol": null, 
     "Price": 0, 
     "Diff": 0, 
     "PercentageDiff": 0, 
     "Volume": null, 
     "TotalTurnOverAmount": 109969058, 
     "FirmName": "Vision Securities Pvt. Ltd.", 
     "BrokerID": 0, 
     "BrokerCode": "34", 
     "TotalTransactions": 0, 
     "Traded": null, 
     "MaxPrice": null, 
     "MinPrice": null, 
     "OpeningPrice": null, 
     "TotalShare": null, 
     "NoOfTransaction": 0, 
     "Purchase": 70691939, 
     "Sales": 39277119, 
     "Matching": 6381555 
    }, 
    { 
     "__type": "SageFrame.MarketMovers.MarketInfo", 
     "RowTotal": 0, 
     "StockID": 0, 
     "CodedCompany": null, 
     "ClosingPrice": null, 
     "Amount": 0, 
     "PreviousClosing": 0, 
     "DifferenceRS": 0, 
     "Symbol": null, 
     "Price": 0, 
     "Diff": 0, 
     "PercentageDiff": 0, 
     "Volume": null, 
     "TotalTurnOverAmount": 104830489, 
     "FirmName": "Online Securities Pvt. Ltd.", 
     "BrokerID": 0, 
     "BrokerCode": "49", 
     "TotalTransactions": 0, 
     "Traded": null, 
     "MaxPrice": null, 
     "MinPrice": null, 
     "OpeningPrice": null, 
     "TotalShare": null, 
     "NoOfTransaction": 0, 
     "Purchase": 51927902, 
     "Sales": 52902587, 
     "Matching": 3049044 
    } 
] 
} 

とき私は2つのパラメータでPOSTリクエストを送信します

{ 
    "offset":"1", 
    "limit":"2000" 
} 

私は上記の結果を得ることができます。今私は同じ結果を返す必要がありますが、自分のコントローラを介して。上記のコントローラーは、すべてのプロパティでnull値を持つMyPojoクラスを返します。

+0

あなたMyPoj oサードパーティのAPIが返すJSONと正確に一致しませんか? –

+0

MyPojo myPojo = restTemplate.postForObject(uri、brokerRequest、MyPojo.class); このコード行は値を返しません。 –

+0

サードパーティのAPIが別のデータ形式を返している可能性があります。たぶんxml。 –

答えて

1

サードパーティAPIの結果を常にマップに入れることができます。

Map results = restTemplate.postForObject(uri,brokerRequest, Map.class); 

また、3番目の部分API用に新しいpojoを作成することもできます。

ThirdPartyPojo results = restTemplate.postForObject(uri,brokerRequest, ThirdPartyPojo.class); 
+0

はい、私はあなたが第二の選択肢で言ったようにしています。 –

+0

{ "__type":ヌル、 "記号":ヌル、 "販売":ヌル、 "totalTransactions":ヌル、 "previousClosing":ヌル、 - :それは、このようなすべてのプロパティに対してnull値を返します。 "diff":null、 "トレード":null、 "closingPrice":null .... } –

+0

マップを試しましたか?マップでは、サードパーティAPIからの応答であるint値の値を使用します。 Mapを使用した後にフィールドがまだnullの場合、その値はサードパーティAPIからのnullであることを意味します。 –

0

今の問題は、あなたのPOJO MyPojoは、サードパーティのAPIの応答に対応していないということです。

あなたのpojoは次のようなものです。

----------------------------------- com.example.D.java ---- -------------------------------

package com.example; 

import java.util.HashMap; 
import java.util.Map; 
import com.fasterxml.jackson.annotation.JsonAnyGetter; 
import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 

public class D { 

private String type; 
private Integer rowTotal; 
private Integer stockID; 
private Object codedCompany; 
private Object closingPrice; 
private Integer amount; 
private Integer previousClosing; 
private Integer differenceRS; 
private Object symbol; 
private Integer price; 
private Integer diff; 
private Integer percentageDiff; 
private Object volume; 
private Integer totalTurnOverAmount; 
private String firmName; 
private Integer brokerID; 
private String brokerCode; 
private Integer totalTransactions; 
private Object traded; 
private Object maxPrice; 
private Object minPrice; 
private Object openingPrice; 
private Object totalShare; 
private Integer noOfTransaction; 
private Integer purchase; 
private Integer sales; 
private Integer matching; 

// Getter .. Setter// 
} 

------------ ----------------------- com.example.MyPojo.java -------------------- ---------------

import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 
import com.fasterxml.jackson.annotation.JsonAnyGetter; 
import com.fasterxml.jackson.annotation.JsonAnySetter; 
import com.fasterxml.jackson.annotation.JsonIgnore; 
import com.fasterxml.jackson.annotation.JsonInclude; 
import com.fasterxml.jackson.annotation.JsonProperty; 
import com.fasterxml.jackson.annotation.JsonPropertyOrder; 

public class Example { 

@JsonProperty("d") 
private List<D> d = null; 

// Getter ... Setter 
} 

または単にマップを使用できます。

+0

私はこれを私のローカルマシンで試しました。 'firmName'のようなプロパティはまだnullです。 –

+0

可能性のある問題は、ゲッターセッターメソッド名が正しくない可能性があります。それを確認できますか? –

+0

ここで私はまだヌルになっています。 –

1

これも、あなたはカスタムマッピングを提供したり、何でもそのようにして(ただし、ない同じヘッダ)あなたのコントローラが同じ応答を提供ウィルことを保証するために必要としない簡単に行うことができます。

@RestController 
final class Controller { 

    // Both RestTemplate and URI instances can be cached 
    private static final RestTemplate restTemplate = new RestTemplate(); 
    private static final URI testUri = URI.create("http://www.nepalipaisa.com/Modules/MarketMovers/Services/MarketMoversServices.asmx/GetTopBrokers"); 

    // I'm using GET just to simplify the testing using a web browser 
    @RequestMapping(method = GET, value = "/") 
    public void post(final ServletResponse response) 
      throws IOException { 
     // Create a POST request entity 
     final RequestEntity<?> requestEntity = new RequestEntity<>(getRequest(0, 10), POST, testUri); 
     // And send the request to the remote server 
     final ResponseEntity<Resource> responseEntity = restTemplate.exchange(requestEntity, Resource.class); 
     // Now just copy the response input stream to the output stream of this controller 
     try (final InputStream inputStream = responseEntity.getBody().getInputStream()) { 
      // Or provide HttpServletResponse via the controller method to be able to configure the response more accurately 
      StreamUtils.copy(inputStream, response.getOutputStream()); 
     } 
    } 

    private static Object getRequest(final long offset, final long limit) { 
     final Map<String, Object> request = new HashMap<>(); 
     request.put("offset", offset); 
     request.put("limit", limit); 
     return request; 
    } 

} 

リモートサーバが非正常な応答コードで応答することができますので、あなたもRestTemplate例外を処理するカスタムコントローラのアドバイスを持つことができます:あなたがいることを言っている

@ControllerAdvice 
final class ExceptionControllerAdvice { 

    @ExceptionHandler(HttpServerErrorException.class) 
    @ResponseBody 
    public ResponseEntity<?> handleHttpServerErrorException(final HttpServerErrorException ex) { 
     return new ResponseEntity<Object>("Bad gateway: " + ex.getMessage(), BAD_GATEWAY); 
    } 

} 
+0

それは働いた。これを投票した。 –

関連する問題