Raw encoder.
This commit is contained in:
parent
9cc185f545
commit
e284861539
25
README.md
25
README.md
@ -75,6 +75,31 @@ httpClient := &http.Client{}
|
|||||||
api := NewSuggestApi(WithHttpClient(httpClient))
|
api := NewSuggestApi(WithHttpClient(httpClient))
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### Low level client usage
|
||||||
|
|
||||||
|
Pass and consume raw bytes/strings:
|
||||||
|
|
||||||
|
```go
|
||||||
|
endpointUrl, err := url.Parse("https://suggestions.dadata.ru/suggestions/api/4_1/rs/")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cli := client.NewClient(endpointUrl,
|
||||||
|
client.WithEncoderFactory(encoder.RawEncoderFactory()),
|
||||||
|
client.WithDecoderFactory(encoder.RawDecoderFactory()),
|
||||||
|
)
|
||||||
|
|
||||||
|
request := bytes.NewBufferString("{ \"query\": \"москва хабар\" }")
|
||||||
|
response := &bytes.Buffer{}
|
||||||
|
|
||||||
|
err = cli.Post(context.Background(), "suggest/address", request, response)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Print(response.String()) // Output: `{"suggestions":[{"value":"г Москва, ул Хабаровская",...`
|
||||||
|
```
|
||||||
|
|
||||||
## Licence
|
## Licence
|
||||||
MIT see [LICENSE](LICENSE)
|
MIT see [LICENSE](LICENSE)
|
||||||
|
@ -94,7 +94,7 @@ func (c *Client) doRequest(ctx context.Context, method string, url *url.URL, bod
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
if err = c.options.decoderFactory(response.Body)(&result); err != nil {
|
if err = c.options.decoderFactory(response.Body)(result); err != nil {
|
||||||
return fmt.Errorf("doRequest: response body decode err: %w", err)
|
return fmt.Errorf("doRequest: response body decode err: %w", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package client
|
package client
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"fmt"
|
"fmt"
|
||||||
@ -9,6 +10,7 @@ import (
|
|||||||
|
|
||||||
"github.com/ekomobile/dadata/v2/api/suggest"
|
"github.com/ekomobile/dadata/v2/api/suggest"
|
||||||
"github.com/ekomobile/dadata/v2/client/transport"
|
"github.com/ekomobile/dadata/v2/client/transport"
|
||||||
|
"github.com/ekomobile/dadata/v2/client/transport/encoder"
|
||||||
)
|
)
|
||||||
|
|
||||||
func ExampleNewClient() {
|
func ExampleNewClient() {
|
||||||
@ -108,3 +110,26 @@ func ExampleWithEncoderFactory() {
|
|||||||
fmt.Printf("%s", s.Value)
|
fmt.Printf("%s", s.Value)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func ExampleClient_low_level() {
|
||||||
|
var err error
|
||||||
|
endpointUrl, err := url.Parse("https://suggestions.dadata.ru/suggestions/api/4_1/rs/")
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cli := NewClient(endpointUrl,
|
||||||
|
WithEncoderFactory(encoder.RawEncoderFactory()),
|
||||||
|
WithDecoderFactory(encoder.RawDecoderFactory()),
|
||||||
|
)
|
||||||
|
|
||||||
|
request := bytes.NewBufferString("{ \"query\": \"москва хабар\" }")
|
||||||
|
response := &bytes.Buffer{}
|
||||||
|
|
||||||
|
err = cli.Post(context.Background(), "suggest/address", request, response)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
fmt.Print(response.String())
|
||||||
|
}
|
||||||
|
54
client/transport/encoder/rw.go
Normal file
54
client/transport/encoder/rw.go
Normal file
@ -0,0 +1,54 @@
|
|||||||
|
package encoder
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
|
||||||
|
"github.com/ekomobile/dadata/v2/client/transport"
|
||||||
|
)
|
||||||
|
|
||||||
|
// RawEncoderFactory is a factory for noop-encoder that just writes to transport io.Writer.
|
||||||
|
func RawEncoderFactory() transport.EncoderFactory {
|
||||||
|
return func(w io.Writer) transport.Encoder {
|
||||||
|
return func(v interface{}) (err error) {
|
||||||
|
switch value := v.(type) {
|
||||||
|
case *string:
|
||||||
|
_, err = w.Write([]byte(*value))
|
||||||
|
case string:
|
||||||
|
_, err = w.Write([]byte(value))
|
||||||
|
case *[]byte:
|
||||||
|
_, err = w.Write(*value)
|
||||||
|
case []byte:
|
||||||
|
_, err = w.Write(value)
|
||||||
|
case io.Reader:
|
||||||
|
_, err = io.Copy(w, value)
|
||||||
|
case io.WriterTo:
|
||||||
|
_, err = value.WriteTo(w)
|
||||||
|
default:
|
||||||
|
err = fmt.Errorf("can not encode from value: %#v", v)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// RawDecoderFactory is a factory for noop-decoder that just reads from transport io.Reader.
|
||||||
|
func RawDecoderFactory() transport.DecoderFactory {
|
||||||
|
return func(r io.Reader) transport.Decoder {
|
||||||
|
return func(v interface{}) (err error) {
|
||||||
|
switch value := v.(type) {
|
||||||
|
case *[]byte:
|
||||||
|
_, err = r.Read(*value)
|
||||||
|
case []byte:
|
||||||
|
_, err = r.Read(value)
|
||||||
|
case io.Writer:
|
||||||
|
_, err = io.Copy(value, r)
|
||||||
|
case io.ReaderFrom:
|
||||||
|
_, err = value.ReadFrom(r)
|
||||||
|
default:
|
||||||
|
err = fmt.Errorf("can not decode into value: %#v", v)
|
||||||
|
}
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -3,11 +3,15 @@
|
|||||||
package dadata
|
package dadata
|
||||||
|
|
||||||
import (
|
import (
|
||||||
|
"bytes"
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"net/url"
|
||||||
"os"
|
"os"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
|
"github.com/ekomobile/dadata/v2/client"
|
||||||
|
"github.com/ekomobile/dadata/v2/client/transport/encoder"
|
||||||
"github.com/stretchr/testify/suite"
|
"github.com/stretchr/testify/suite"
|
||||||
|
|
||||||
"github.com/ekomobile/dadata/v2/api/suggest"
|
"github.com/ekomobile/dadata/v2/api/suggest"
|
||||||
@ -53,6 +57,27 @@ func (s *ApiSuggestIntegrationTest) TestAddress() {
|
|||||||
s.NotEmpty(res)
|
s.NotEmpty(res)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (s *ApiSuggestIntegrationTest) TestAddress_low_level() {
|
||||||
|
var err error
|
||||||
|
endpointUrl, err := url.Parse(EndpointURLSuggest)
|
||||||
|
if err != nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
cli := client.NewClient(endpointUrl,
|
||||||
|
client.WithEncoderFactory(encoder.RawEncoderFactory()),
|
||||||
|
client.WithDecoderFactory(encoder.RawDecoderFactory()),
|
||||||
|
)
|
||||||
|
|
||||||
|
request := bytes.NewBufferString("{ \"query\": \"москва хабар\" }")
|
||||||
|
response := &bytes.Buffer{}
|
||||||
|
|
||||||
|
err = cli.Post(context.Background(), "suggest/address", request, response)
|
||||||
|
|
||||||
|
s.NoError(err)
|
||||||
|
s.NotEmpty(response.String())
|
||||||
|
}
|
||||||
|
|
||||||
func (s *ApiSuggestIntegrationTest) TestAddressWithLanguageParamRU() {
|
func (s *ApiSuggestIntegrationTest) TestAddressWithLanguageParamRU() {
|
||||||
api := NewSuggestApi()
|
api := NewSuggestApi()
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user