Un puissant client HTTP .NET Restful, prend en charge l'intercepteur, la conversion de messages, Get, Post, Put, Delete, le téléchargement de fichiers, le téléchargement de fichiers, le proxy, la vérification du certificat HTTPS.
Cadre cible | Version | Oui/Non |
---|---|---|
.FILET | 8.x | Oui |
.FILET | 7.x | Oui |
.FILET | 6.x | Oui |
.FILET | 5.x | Non |
Noyau .NET | 3.x | Non |
Noyau .NET | 2.x | Non |
Norme .NET | 2.1 | Non |
Norme .NET | 2.0 | Non |
Norme .NET | 1.x | Non |
Cadre .NET | Tous | Non |
dotnet add package RetrofitNet
public interface IPersonService
{
[ HttpPost ( "/api/Auth/GetJwtToken" ) ]
Response < TokenModel > GetJwtToken ( [ FromForm ] AuthModel auth ) ;
[ HttpGet ( "/api/Person" ) ]
Response < IList < Person > > Get ( ) ;
[ HttpPost ( "/api/Person" ) ]
Response < Person > Add ( [ FromBody ] Person person ) ;
[ HttpGet ( "/api/Person/{id}" ) ]
Response < Person > Get ( [ FromPath ] int id ) ;
[ HttpPut ( "/api/Person/{id}" ) ]
Response < Person > Update ( [ FromPath ] int id , [ FromBody ] Person person ) ;
[ HttpDelete ( "/api/Person/{id}" ) ]
Response < Person > Delete ( [ FromPath ] int id ) ;
[ HttpGet ( "https://www.baidu.com/index.html" ) ]
Response < dynamic > GetBaiduHome ( ) ;
}
using Retrofit . Net . Core ;
using Retrofit . Net . Core . Models ;
var client = new RetrofitClient . Builder ( )
. AddInterceptor ( new HeaderInterceptor ( ) )
. Build ( ) ;
var retrofit = new Retrofit . Net . Core . Retrofit . Builder ( )
. AddBaseUrl ( "https://localhost:7177" )
. AddClient ( client )
. Build ( ) ;
var service = retrofit . Create < IPersonService > ( ) ;
Response < TokenModel > authResponse = service . GetJwtToken ( new AuthModel ( ) { Account = "admin" , Password = "admin" } ) ;
Response < IList < Person > > response = await service . Get ( ) ;
Console . WriteLine ( JsonConvert . SerializeObject ( response ) ) ;
Response < Person > response = await service . Add ( new Person { Id = 1 , Name = "老中医" , Age = 18 } ) ;
Console . WriteLine ( JsonConvert . SerializeObject ( response ) ) ;
var response = service . Update ( 1 , new Person ( ) { Name = "Charlie" } ) ;
var response = service . Delete ( 1 ) ;
SoumettreEntité.cs
public class SubmitEntity
{
public string Name { get ; set ; }
public FieldFile File { get ; set ; }
// You can upload multiple files including parameters like this
// public FieldFile File2 { get; set; }
// for more File3,File4...
}
télécharger
var response = service . Submit ( new SubmitEntity {
Name = "老中医" ,
File = new FieldFile { FilePath = "/Users/onllyarchibald/Downloads/icon_unlocked.png" }
} ) ;
Console . WriteLine ( JsonConvert . SerializeObject ( response ) ) ;
…vous pouvez trouver plus d’exemples de code ici.
Définissez votre API :
[ HttpGetStream ( "/WeatherForecast/Download" ) ]
Task < Response < Stream > > Download ( [ FromQuery ] string arg1 ) ;
Exemple:
Response < Stream > response = await service . Download ( "test" ) ;
Après avoir obtenu le flux réactif http, vous pouvez le stocker, comme ceci :
Response < Stream > response = await service . Download ( "test" ) ;
Stream outStream = File . Create ( "/Users/onllyarchibald/Desktop/a.zip" ) ;
byte [ ] buffer = new byte [ 1024 ] ;
int i ;
do {
i = response . Body ! . Read ( buffer , 0 , buffer . Length ) ;
if ( i > 0 ) outStream . Write ( buffer , 0 , i ) ;
} while ( i > 0 ) ;
outStream . Close ( ) ;
response . Body . Close ( ) ;
Console . WriteLine ( "File download completed..." ) ;
La capture d'écran ci-dessous utilise le plugin ShellProgressBar. Veuillez consulter le code pour plus de détails. …vous pouvez trouver plus d’exemples de code ici.
application / json - > [ FromBody ]
multipart / form - data - > [ FromForm ]
Ici, vous pouvez configurer le convertisseur « intercepteur », « timeout », « réponse ». comme ça:
var client = new RetrofitClient . Builder ( )
. AddInterceptor ( new HeaderInterceptor ( ) ) // Add Interceptor
. AddInterceptor ( new SimpleInterceptorDemo ( ) ) // ...
. AddTimeout ( TimeSpan . FromSeconds ( 10 ) ) // The default wait time after making an http request is 6 seconds
. Build ( ) ;
var retrofit = new Retrofit . Net . Core . Retrofit . Builder ( )
. AddBaseUrl ( "https://localhost:7283" ) // Base Url
. AddClient ( client )
. AddConverter ( new DefaultXmlConverter ( ) ) // The internal default is ‘DefaultJsonConverter’ if you don’t call ‘.AddConverter(new DefaultJsonConverter())’
. Build ( ) ;
vous pouvez trouver plus d'exemples de code ici.
La réponse à une demande contient les informations suivantes.
public class Response < T >
{
// Http message
public string ? Message { get ; internal set ; }
// Response body. may have been transformed, please refer to Retrofit.Builder.AddConverterFactory(...).
public T ? Body { get ; internal set ; }
// Http status code.
public int StatusCode { get ; internal set ; }
// Response headers.
public IEnumerable < KeyValuePair < string , object > > ? Headers { get ; internal set ; }
}
Lorsque la demande est réussie, vous recevrez la réponse comme suit :
Response < IList < Person > > response = await service . Get ( ) ;
Console . WriteLine ( response . Body ) ;
Console . WriteLine ( response . Message ) ;
Console . WriteLine ( response . StatusCode ) ;
Console . WriteLine ( response . Headers ) ;
Pour chaque http requête, nous pouvons ajouter un ou plusieurs intercepteurs grâce auxquels nous pouvons intercepter les requêtes 、 réponses et erreurs.
.. . RetrofitClient . Builder ( )
. AddInterceptor ( new YourCustomInterceptor ( ) )
. Build ( ) ;
public class SimpleInterceptorDemo : ISimpleInterceptor
{
public void OnRequest ( Request request )
{
Debug . WriteLine ( $ "REQUEST[ { request . Method } ] => PATH: { request . Path } " ) ;
}
public void OnResponse ( Response < dynamic > response )
{
Debug . WriteLine ( $ "RESPONSE[ { response . StatusCode } ] => Message: { response . Message } " ) ;
}
}
Des intercepteurs avancés peuvent être implémentés en héritant de l'interface IAdvancedInterceptor. Ensuite je vous raconterai à travers un exemple de renouvellement de token
public class HeaderInterceptor : IAdvancedInterceptor
{
public Response < dynamic > Intercept ( IChain chain )
{
// Get token from local file system
string ? token = null ;
if ( File . Exists ( "token.txt" ) ) token = File . ReadAllText ( "token.txt" ) ;
// Add token above
Request request = chain . Request ( ) . NewBuilder ( )
. AddHeader ( "Authorization" , $ "Bearer { token } " )
. Build ( ) ;
Response < dynamic > response = chain . Proceed ( request ) ;
if ( response . StatusCode == 401 )
{
// Get a new token and return
// The way to get the new token here depends on you,
// you can ask the backend to write an API to refresh the token
request = chain . Request ( ) . NewBuilder ( )
. AddHeader ( "Authorization" , $ "Bearer <new token>" )
. Build ( ) ;
// relaunch!
response = chain . Proceed ( request ) ;
}
return response ;
}
}
Dans tous les intercepteurs, vous pouvez interférer avec leur flux d'exécution. Si vous souhaitez résoudre la demande/réponse avec des données personnalisées, vous pouvez appeler return new Response<dynamic>();
.
public Response < dynamic > Intercept ( IChain chain )
{
return new Response < dynamic > ( ) ;
}
Converter
permet de modifier les données de demande/réponse avant qu'elles ne soient envoyées/reçues au serveur. J'ai implémenté un DefaultXmlConverter
et DefaultJsonConverter
comme convertisseur par défaut. Si vous souhaitez personnaliser la conversion des données de requête/réponse, vous pouvez définir une classe qui hérite de « IConverter » et remplacer DefaultJsonConverter
en définissant .AddConverter(new YourCustomConverter())
.
public class DefaultJsonConverter : IConverter
{
// value: Data returned from the server
// type: The return type of the interface you declared
// return value: What type do you want to convert to? Here is to convert the json returned by the server /// to the interface return type you defined
public object ? OnConvert ( string from , Type to )
{
if ( from is null ) return from ;
if ( to == typeof ( Stream ) ) return from ;
if ( to ? . Namespace ? . StartsWith ( "System" ) is not true )
{
return JsonConvert . DeserializeObject ( from . ToString ( ) ?? "" , to ! ) ;
}
return from ;
}
}
vous pouvez trouver plus d'exemples de code ici.
Ce projet open source autorisé par https://github.com, et la licence est MIT.
Veuillez déposer les demandes de fonctionnalités et les bogues sur le système de suivi des problèmes.